package com.cuz.daileetcode;

import java.lang.annotation.ElementType;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author cuzz
 * @version 1.0
 * @description: 给你个整数数组 arr，其中每个元素都 不相同。
 * <p>
 * 请你找到所有具有最小绝对差的元素对，并且按升序的顺序返回。
 * <p>
 *
 * <p>
 * 示例 1：
 * <p>
 * 输入：arr = [4,2,1,3]
 * 输出：[[1,2],[2,3],[3,4]]
 * 示例 2：
 * <p>
 * 输入：arr = [1,3,6,10,15]
 * 输出：[[1,3]]
 * 示例 3：
 * <p>
 * 输入：arr = [3,8,-10,23,19,-4,-14,27]
 * 输出：[[-14,-10],[19,23],[23,27]]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/minimum-absolute-difference
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @date 20:43 2021/9/19
 **/
public class Day2 {


    public static class Solution1 {
        public List<List<Integer>> findMinimumAbsDifference(int[] arr) {
            LinkedList<List<Integer>> res = new LinkedList<>();
            if (arr == null || arr.length == 0 || arr.length == 1) {
                return res;
            }
            Arrays.sort(arr);
            int firstIndex = 0;
            int secondIndex = 1;
            int minAbs = Integer.MAX_VALUE;
            while (secondIndex < arr.length) {
                minAbs = Math.min(Math.abs(arr[firstIndex] - arr[secondIndex]), minAbs);
                secondIndex++;
                firstIndex++;
            }
             firstIndex = 0;
             secondIndex = 1;
            while (secondIndex < arr.length) {
               if (Math.abs(arr[firstIndex] - arr[secondIndex])<=minAbs){
                   res.add(Arrays.asList(arr[firstIndex],arr[secondIndex]));
                }
                secondIndex++;
                firstIndex++;
            }
            return res;
        }
    }


    public static class Solution2 {
        public static void main(String[] args) {
            List<List<Integer>> minimumAbsDifference = new Solution2().findMinimumAbsDifference(new int[]{4, 2, 1, 3});
            System.out.println(minimumAbsDifference);
        }
        public List<List<Integer>> findMinimumAbsDifference(int[] arr) {
            LinkedList<List<Integer>> res = new LinkedList<>();
            if (arr == null) {
                return res;
            }
            Arrays.sort(arr);
            int firstIndex = 0;
            int secondIndex = 1;
            int minAbs = Integer.MAX_VALUE;
            while (secondIndex < arr.length) {
                int temp = Math.abs(arr[firstIndex] - arr[secondIndex]);
                if (minAbs== temp){
                    res.add(Arrays.asList(arr[firstIndex],arr[secondIndex]));
                }
                else if (minAbs> temp){
                    res.clear();
                    res.add(Arrays.asList(arr[firstIndex],arr[secondIndex]));
                    minAbs=temp;
                }
                secondIndex++;
                firstIndex++;
            }
            return res;
        }
    }
}
